package com.itheima.health.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.health.dao.PermissionDao;
import com.itheima.health.dao.RoleDao;
import com.itheima.health.dao.UserDao;
import com.itheima.health.entity.PageResult;

import com.itheima.health.entity.Result;
import com.itheima.health.pojo.Permission;
import com.itheima.health.pojo.Role;
import com.itheima.health.pojo.User;
import com.itheima.health.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author ：seanyang
 * @date ：Created in 2019/6/7
 * @description ：
 * @version: 1.0
 */
@Service(interfaceClass = UserService.class)
@Slf4j
@Transactional
public class UserServiceImpl implements UserService {

	@Autowired
	private UserDao userDao;
	@Autowired
	private RoleDao roleDao;
	@Autowired
	private PermissionDao permissionDao;

	@Override
	public boolean login(String username, String password) {
		log.debug("service_provide...u:{},p:{}",username,password);
		if("admin".equals(username) && "123".equals(password)){
			return true;
		}
		return false;
	}

	/**
	 * 1.根据用户名获取用户对象
	 * 2.根据用户ID，提前角色列表
	 * 3.根据角色ID，提前权限列表
	 * 4.把数据封装到User对象
	 * @param username
	 * @return
	 */
	@Override
	public User findByUsername(String username) {
		// 根据用户名获取用户对象
		User user = userDao.findByUsername(username);
		if(user == null){
			return  null;
		}
		// 根据用户ID，提前角色列表
		Set<Role>  roles = roleDao.findByUserId(user.getId());
		user.setRoles(roles);
		// 根据角色ID，提前权限列表
		for (Role role:roles){
			Integer roleId = role.getId();
			Set<Permission> permissionSet = permissionDao.findByRoleId(roleId);
			role.setPermissions(permissionSet);
		}
		return user;
	}

	/**
	 * userservice业务实现
	 * @param currentPage 当前页
	 * @param pageSize 煤每一页多少记录
	 * @param queryString 查询条件
	 * @return
	 */
	@Override
	public PageResult pageQuery(Integer currentPage, Integer pageSize, String queryString) {
		PageHelper.startPage(currentPage,pageSize);
		Page<User> page = userDao.findByCondition(queryString);
		PageResult pageResult = new PageResult(page.getTotal(),page.getResult());
		return pageResult;
	}

	/**
	 *
	 * @return返回角色列表
	 */
	@Override
	public Result findAllRole() {
		List<Role> roles= null;
		try {
			roles = userDao.findAllRole();
			return new Result(true,"查询角色信息成功",roles);
		} catch (Exception e) {
			e.printStackTrace();
			return  new Result(false,"查询角色信息失败");
		}

	}

	/**
	 * 新增用户，并添加关联关系
	 * @param user
	 * @param roleIds
	 */
	@Override
	public void add(User user, Integer[] roleIds) {
		String password = user.getPassword();
		userDao.add(user);
		for (Integer roleId : roleIds) {
			Map map=new HashMap<>();
			map.put("userid", user.getId());
			map.put("roleid", roleId);
			userDao.addByUserId(map);
		}
	}

	/**
	 * 根据用户id查询用户信息
	 * @param userId
	 * @return
	 */
	@Override
	public User findById(Integer userId) {
		User user=userDao.findById(userId);
		return user;
	}

	/**
	 * 查询role id
	 * @param id
	 * @return
	 */
	@Override
	public List<Integer> findRoleIdsByCheckGroupId(Integer id) {
		List<Integer> list=userDao.findRoleIdsByCheckGroupId(id);
		return list;
	}

	/**
	 * 编辑保存
	 * @param user
	 * @param roleIds
	 */
	@Override
	public void edit(User user, Integer[] roleIds) {
		//保存信息
		userDao.edit(user);
		//删除之前得关联关系
		userDao.deleteCheckItemsListByIds(user.getId());
		for (Integer roleId : roleIds) {

			Map map = new HashMap<>();
			map.put("userid", user.getId());
			map.put("roleid", roleId);
			userDao.addByUserId(map);
		}
	}

	/**
	 * 删除操作
	 * @param id
	 */
	@Override
	public void delById(Integer id) {
		//删除之前先查询有没有关联
		int count=userDao.findByIdWhitRoleAndUser(id);
		if (count > 0) {
			throw new RuntimeException("有关连数据不能删除");
		}
		//没有关联数据
		userDao.delById(id);
	}
}
